/**
 * Created by zhourh on 2018/6/21.
 *
 * 给定一个字符串 s，计算具有相同数量0和1的非空(连续)子字符串的数量，并且这些子字符串中的所有0和所有1都是组合在一起的。

 重复出现的子串要计算它们出现的次数。

 示例 1 :

 输入: "00110011"
 输出: 6
 解释: 有6个子串具有相同数量的连续1和0：“0011”，“01”，“1100”，“10”，“0011” 和 “01”。

 请注意，一些重复出现的子串要计算它们出现的次数。

 另外，“00110011”不是有效的子串，因为所有的0（和1）没有组合在一起。
 示例 2 :

 输入: "10101"
 输出: 4
 解释: 有4个子串：“10”，“01”，“10”，“01”，它们具有相同数量的连续1和0。

 字符串
 */
public class CountBinarySubstrings {

    public static void main(String[] args) {
        System.out.println(new CountBinarySubstrings().countBinarySubstrings("00110011"));
        System.out.println(new CountBinarySubstrings().countBinarySubstrings("10101"));
        System.out.println(new CountBinarySubstrings().countBinarySubstrings("000111000"));

    }

    public int countBinarySubstrings(String s) {
        if (s == null || s.length() < 2) {
            return 0;
        }

        int zeroCount = 0, oneCount = 0, subCount = 0;
        char lastChar = 0;

        char[] charArray = s.toCharArray();
        for (char c : charArray) {
            if (lastChar == 0) {
                //第一个元素
                lastChar = c;
                zeroCount = (c == '0' ? 1 : 0);
                oneCount = (c == '1' ? 1 : 0);
                continue;
            }

            if (lastChar == c) {
                // 和上一个元素相同
                zeroCount += (c == '0' ? 1 : 0);
                oneCount += (c == '1' ? 1 : 0);
            } else {
                // 和上一个元素不同
                zeroCount = (c == '0' ? 1 : zeroCount);
                oneCount = (c == '1' ? 1 : oneCount);
                subCount++;
                lastChar = c;
                continue;
            }

            lastChar = c;

            if ((c == '0' && oneCount >= zeroCount) || (c == '1' && zeroCount >= oneCount)) {
                subCount++;

                continue;
            }
        }

        return subCount;
    }
}
